package zuochengyun;

/**
 * 字符串和数字的对应关系
 * 比如A  -- 1 ...  Z -- 26  AA -- 27
 */
public class StringRadixToNumber {

	public static void main(String[] args) {
		StringRadixToNumber object = new StringRadixToNumber();
		char[] chs = {'A', 'B', 'C'};
		System.out.println(object.getString(chs, 72));
	}
	
	/**
	 * 字符串与数字转换类似于进制转换，但并不是一样的。因为字符串没有0，是从1 -- k，进制是0 -- k - 1
	 * 比如72 转换成3进制 是2200，但是转换成ABC表示的就不一样了 BABC
	 * chs:含有多少个字符，就是几进制
	 * 将n转换为该进制下的表示
	 */
	public String getString(char[] chs, int n){
		if(chs == null || chs.length <= 0 || n <= 0){
			return "";
		}
		int cur = 1;	//是从1开始的
		int base = chs.length;		//是几进制
		int len = 0;	//一共含有多少个字母
		//比如3进制，n = 72，就只包含到了27，只有四个字母
		while(n >= cur){
			len++;
			n -= cur;
			cur *= base;
		}
		
		char[] res = new char[len];
		int index = 0;
		int curNumber = 0;	//当前对应的字符
		
		do{
			cur /= base;	//由于之前cur已经超过了n，所以需要除以一个base。比如之前为81，除以3为27
			curNumber = n / cur;
			System.out.println("cur:" + cur + " " + curNumber);
			//注意，之前已经减了一个27， 9， 3， 1，所以这里需要再加1
			res[index++] = getKthChar(chs, curNumber + 1);
			n = n % cur;
		}while(n > 0);
		return String.valueOf(res);
	}
		

	//上面的解法麻烦了
	 //这道题看起来很简单，是一个进制转换的问题，其实有一点不同的是，一般的进制是0 ~ n - 1
    //而英文字母是1 ~ n
	//将数字转换为对应的字符串表示
	//1 --> A, 2 --> B... 26 --> Z, 28 --> AB 
    public String convertToTitle(int n) {
        if(n <= 0){
            return "";
        }
        int mod = 0;
        char[] chars = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H','I','J','K','L','M','N','O','P',
        		'Q','R','S','T','U','V','W','X','Y','Z'};
        StringBuilder sb = new StringBuilder();
        while(n > 0){
            mod = (n - 1) % 26;
            n = (n - mod - 1)  / 26;
            sb.append(chars[mod]);
        }
        return sb.reverse().toString();
    }

    
	private char getKthChar(char[] chs, int curChar) {
		if( curChar < 1 || curChar > chs.length){
			return 0;
		}
		return chs[curChar - 1];
	}
	
	
	public int getNum(char[] chs, String str){
		if(chs == null || chs.length <= 0){
			return 0;
		}
		char[] strc = str.toCharArray();
		int base = chs.length;
		int cur = 1;
		int res = 0;
		for (int i = strc.length - 1; i >= 0; i--) {
			res += getNumFromChar(chs, strc[i]) * cur; 
			cur *= base;
		}
		return res;
	}
	
	public int getNumFromChar(char[] chs, char curChar){
		for (int i = 0; i < chs.length; i++) {
			if(chs[i] == curChar){
				return i + 1;
			}
		}
		return -1;
	}
}
